<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>class声明方法不能被遍历</title>
</head>
<body>
    
</body>
<script>
    // 用到class类的时候  我们必须始终牢记  类是原型的语法糖

    function User(name){
        this.name = name
    }
    let u = new User('jimmy')
    User.prototype.show = ()=>{}
    
    for (const key in u) {
        console.log(key)  //name show
        if(u.hasOwnProperty(key))  //Object.hasOwnProperty('属性')   判断某个属性是不是在它的本身就存在  他不会查找到原型
        console.log(key)  //name
    }
    // 可见 我们是给原型对象添加的show方法也被遍历出来了  这个不是我们想要的  我们只想要遍历出当前对象的属性
    // 除非我们自己再手动的添加一个Object.hasOwnProperty()  来判断key是不是专属于对象 而不包含原型

    class hd{
        constructor(value){
            this.name = value
        }
        show(){}
    }
    let h = new hd('xuexue')
    for (const key in h) {
        console.log(key)  // name
    }
    // 所以 语法糖的好处就是逐步的优化  在到类的这一阶段的时候  已经是优化到了不会被查询的地步了
    console.log(Object.getOwnPropertyDescriptor(User.prototype,'show'))  //value: ()=>{} writable: true enumerable: true configurable: true
    // enumerable:true  可见 在使用原型的时候 他的属性的遍历特征默认是开的

    console.log(Object.getOwnPropertyDescriptor(hd.prototype,'show'))  //value: ƒ show() writable: true enumerable: false configurable: true
    // 而在类中 默认是将对enumerable 这个遍历属性调成了false  所以在它的实例对象遍历的时候 是遍历不出来的方法的
</script>
</html>